package dashboard.classinfo;

//一般可以使用反射来获取泛型参数的实际类型
import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import java.util.Map;

public class GenericFieldTest {
	/* 使用反射来获取泛型信息 */
	@SuppressWarnings("unused")
	private Map<String, Integer> score;
	
	public List<String> genericMethod(List<String> param) {
		return param;
	}
	
	public static void main(String[] args) throws SecurityException, NoSuchFieldException, NoSuchMethodException {
		Class<GenericFieldTest> clazz = GenericFieldTest.class;
		Field f = clazz.getDeclaredField("score");
		// 直接使用getType只对普通类型有效，无法取到泛型参数
		Class<?> a = f.getType();
		System.out.println("score的类型是：" + a);
		// 获得Field实例f的泛型类型
		Type gType = f.getGenericType();
		// 如果gType类型是ParameterizedType的对象
		if (gType instanceof ParameterizedType) {
			ParameterizedType pType = (ParameterizedType) gType;
			// 获取原始类型
			Type rType = pType.getRawType();
			System.out.println("原始类型是：" + rType);
			// 取得泛型类型参数
			Type[] tArgs = pType.getActualTypeArguments();
			System.out.println("泛型类型是：");
			for (int i = 0; i < tArgs.length; i++) {
				System.out.println("第" + i + "个泛型类型是：" + tArgs[i]);
			}
		} else {
			System.out.println("获取泛型类型出错！");
		}
		
		System.out.println(GenericFieldTest.class.getMethod("genericMethod",List.class).getGenericReturnType());
		System.out.println(GenericFieldTest.class.getMethod("genericMethod",List.class).getGenericParameterTypes()[0]);
	}

}

// 输出结果如下：
// score的类型是：interface java.util.Map
// 原始类型是：interface java.util.Map
// 泛型类型是：
// 第0个泛型类型是：class java.lang.String
// 第1个泛型类型是：class java.lang.Integer
